perm filename GUNLO.SAI[SYS,HE]8 blob sn#084265 filedate 1974-01-28 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00017 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	GUNLO - the driver program
C00005 00003	_ global storage
C00007 00004	_ external procedures 
C00009 00005	_ initialize program
C00011 00006	_ set adjustable constants
C00012 00007	_ outer-level dynamic storage allocation
C00015 00008	_ initialization and program (command) loop of BLOCK3.
C00017 00009	_ command decoding loop
C00020 00010	_ sub-command decoding - DO, MARK, UNMARK, PLOT
C00022 00011	_	more sub-command decoding - EDIT, KILL, PRINT
C00024 00012	_  more sub-command decoding - SET
C00026 00013	_ more sub-command decoding - CALL
C00028 00014	_ more sub-command decoding - SHOW
C00032 00015	_ more sub-command decoding - NO, SAV
C00034 00016	_ more sub-command decoding - RECEIVE
C00036 00017	_ end of sub-command decoding - INPUT
C00038 ENDMK
C⊗;
COMMENT	GUNLO - the driver program;

BEGIN "GUNLO"

REQUIRE "PREAMB.SAI[SYS,HE]" SOURCE_FILE;
REQUIRE "SYS:PROCES.DEF" SOURCE_FILE;
REQUIRE "DPYSUB.HDR[SYS,HE]" SOURCE_FILE;
REQUIRE "HELIB[1,3]" LIBRARY;

REQUIRE "LINE[SYS,HE]" LOAD_MODULE,
	"LINVER[SYS,HE]" LOAD_MODULE,
	"SCENE[SYS,HE]" LOAD_MODULE,
	"FORSER[SYS,HE]" LOAD_MODULE,
	"SAISER[SYS,HE]" LOAD_MODULE,
	"SAIDIS[SYS,HE]" LOAD_MODULE,
	"PROT[SYS,HE]" LOAD_MODULE,
	"SAVRES[SYS,HE]" LOAD_MODULE,
	"MAPS1[SYS,HE]" LOAD_MODULE,
	"MAPS2[SYS,HE]" LOAD_MODULE,
	"GUNFAI[SYS,HE]" LOAD_MODULE;

DEFINE QFOP="FORWARD PROCEDURE",
	QRI="REFERENCE INTEGER",
	QEP="EXTERNAL SIMPLE PROCEDURE",
	QENP="EXTERNAL PROCEDURE",
	QEIP="EXTERNAL SIMPLE INTEGER PROCEDURE",
	QERP="EXTERNAL SIMPLE REAL PROCEDURE",
	QS="STRING",
	QESP="EXTERNAL SIMPLE STRING PROCEDURE",
	QRA="REAL ARRAY",
	QIA="INTEGER ARRAY",
	QR="REAL",
	QI="INTEGER",
	CL="'15&'12",
	QRR="REFERENCE REAL",
	_="COMMENT",
	QUNFIN="IF BRCHAR='12 THEN GO COMND ELSE GO",
	QUEST="OUTCHR(""?"")",
	QRETURN="BEGIN UNTELL; RETURN END",
	LOOP(I,J,K,L)="FOR I←J STEP L UNTIL K DO",
	QERR="IF ERR THEN BEGIN ERR←0; GO COM2 END",
	QFTREV="IF FTREV=1 THEN ""←"" ELSE ""→""",
	NUMI="CVD(QREAD)",
	SAFEX="SAFE";
_ global storage;

LABEL BL1;

INTERNAL STRING H,COMSTR,NAME,MFILE,COMSAV,LIEXT,EDEXT,PREXT;

INTERNAL REAL RDEP,RMEDA,SHRINK,RDDP,RDNP,RMSD,RMLG,RWIC,RMLE,RCDI,RMALS,
	RMRLS,RDUM,RMSAF,RELLF,RMAP,IRX,IRY,DSCX,DSCY,ISCX,ISCY;

INTERNAL INTEGER IDUM,IA,IB,IC,ID,IE,WHERE,BRCHAR,NGRF,NPAR,NOV,
	NLPT,CVLIN,IWHAT,NOEPL,NOEPM,NOEPA,NOL,IFREEL,IFREEV,
	MAXNOL,MSAFA,NOBAL,MAXNOV,LDATE,ILLL,ILFL,LNCRE1,LNCRE2,MODE,
	SCALE,SIZE,LOCB,LOCT,ORIGX,ORIGY,WIND,DHOLD,IAEDG,MCHAN,MTRACE,
	MODIF,FULREC,ERR,PLTOT,NPRO,PFFREE,PLFTOT,MXNPRO,MAXPLT,DISLAS,
	DISFUS,PLT,NODIS,MAXPFT,PFTOT,PCFTOT,NOLS,EDLIN,FTREV,SCF,
	MAXSCF,PFREE,MAXPLS,MAXPVS,MAPTRC,PFTKEY,MEOF,X,Y,DRX,DRY,DFORCE,
	CFILES,NOUT,III,FRAME;

SAFEX INTERNAL INTEGER ARRAY DICH,DION,DISP,DISPS,DADR,DBRSI[0:15],MCHN[1:10];

SAFEX INTERNAL STRING ARRAY CMSTRS[0:9],CMSAV[1:10];

INTEGER EDGMIN, LINMIN;
_ external procedures ;

	QEIP LINFIT;
	QEP INITIA;
	QEP TELL(QS S);
	QEP UNTELL;
	QEIP QSET(QRI I);
	QESP QREAD;
	QEP SETPAR;
	QEP COMST;
	QENP SORTED;
	QEP EDSAVE;
	QEP EDREST;
	QEP LISAVE;
	QEP LIREST;
	QEP PRSAVE;
	QEP PRREST;
	QEP REGREF(QI I);
	QENP XREFC(QI I);
	QEP TRANSUP;
	QEP UNXREF;
	QEP PRECAL;
	QEP CALC;
	QEP FILESP(QI I);
	QEP UPPDAT;
	QEP LINED;
	QEP RELOPT;
	QEIP BITS(QI I,J,K);
	QESP EXPL(QI I,J; QS S);
	QEIP LNFEAT(QI I);
	QEIP COFEAT(QI I,J,K,L);
	QEIP FINDFT(QI I);
	QEP PARSE;
	QEP CREPRO;
	QEP SHUFFL;
	QEP FTEX;
	QERP QRSET(QRR R);
	QEIP DISX(QR X);
	QEIP DISY(QR Y);
	QEIP LFDIF(QI I,J,K,L,T);
	QEIP MAPCONV(QS CODES);
	QEP OUTLINES;
	QEP K_ZERO;
	QEP K_OUT;
	QEP SUMINT(QRR A,B,C,D; QRI E);
	QEP EDGPRT;
	QEP LININT(QRR T,U,V,W,X,Y,Z);
	QEP LNINTA(QRI LVR, LVI; QRR XV,YV; QRI LC, LV, LI);
	QEP PROINT(QRI PR);
	QEP INTSTR;	QEP EDREC;
	QEP SAIINT(BOOLEAN TTY,PTY,MAIL);
_ initialize program;

	STDBRK(3);
	SETFORMAT(0,2);
	SETBREAK(13,'12&'40&"*?:⊗;",'15,"INS");
	SETBREAK(11,'40,NULL,"XRN");
	SETBREAK(12,".",NULL,"INS");
	SETBREAK(2,".[]"&'12,'15,"INS");

	LOOP(IA,1,14,1)
		BEGIN
		DISP[IA] ← DION[IA] ← 0;
		DICH[IA] ← 1;
		END;
	DISP[1] ← DISP[2] ← DISP[4] ← DISP[5] ← DISP[14] ← 1;

	CMSTRS[0] ← "INPUT*PROT*PROTO.GUN[SYS,HE]*";
	CMSTRS[1] ← "H*SET*DISRPT*0*0*SCALE*5*5*LNCRE*1*1*CVLIN*1*"&
		"CALL*LINFIT*UNMARK*LINES*KILL*FRAME*EDGES*D*";
	CMSTRS[2] ← "H*CALL*PARSE*NULL*SET*LNCRE*2000*2999*D";

	INTMAP(INTTTY_INX,INTSTR,0);
	INTMAP(INTMAIL_INX,INTSTR,0);
	SAIINT(TRUE,FALSE,TRUE);
	ENABLE(INTTTY_INX);
	ENABLE(INTMAIL_INX);
	FRAME ← GETPOG;
	PUT_DATA(0,0,"GUNLO");
	OVERLAY ← TRUE;
	YES_GUN ← TRUE;

_ initialize variables;

	LNCRE1 ← LNCRE2 ← WHERE ← LDATE ← PFFREE ←	PFREE ← 1;
	IWHAT ← CVLIN ← WIND ← CFILES ← MAXPLS ← MAXPVS ← MODE ← DFORCE
		← DHOLD ← MTRACE ← PLT ← NODIS ← PLTOT ← PLFTOT ← PCFTOT
		← PFTOT ← NPRO ← SCF ← 0;
	NPAR ← 28;
	NOEPM ← 50;
	NOUT ← NGRF ← NLPT ← "A";
	MFILE ← COMSTR ← COMSAV ← NULL;
	NAME ← "GUN";
	LIEXT ← EDEXT ← PREXT ← ".TEM";
_ set adjustable constants;

	LINMIN ← 50;
	EDGMIN ← 200;
	MSAFA ← 30;
	RMSAF ← 0.5;
	RMEDA ← 90.;
	SHRINK ← 0.5;
	RDDP ← 1.5;
	RDNP ← 0.45;
	RMSD ← 0.3;
	RMLG ← 0.;
	RWIC ← 3.5;
	RMLE ← 15.;
	RCDI ← 5.;
	RELLF ← 0.18;
	RMALS ← 5.;
	RMRLS ← 0.3;
	ILLL ← 2;
	ILFL ← 3;
	RDEP ← 0.5;
	RMAP ← 12.;
	MXNPRO ← 15;

_ set display parameters

	ORIGX ← 163;
	ORIGY ← 165;
	SCALE ← 750;
	SIZE ← 2;
	IRX ← 150.;
	IRY ← 115.;
	DRX ← 215;
	DRY ← 150;
	DSCX ← DSCY ← 2.5;
	ISCX ← ISCY ← 0.4;
_ outer-level dynamic storage allocation;

_  * *         Prototype data-structure.	           * * *;

BL1:	MAXPFT←4*(MAXPLT←12*MXNPRO);

	BEGIN "BLOCK1"
	LABEL BL2;
	SAFEX INTERNAL STRING ARRAY PNAME[1:MXNPRO];
	SAFEX INTERNAL INTEGER ARRAY PLINES,PVERTS,PPTRL[1:MXNPRO],
		PFLST,PFPRO,PFEAT[1:MAXPFT],
		PFPTR[0:MAXPFT],PLINE,PLINE2,PLINEF[1:MAXPLT];
	PROINT(PLINEF[1]);
	IF WHERE≠1 THEN PRREST;


_ * * *      Edge-storage arrays.			* * * * *;

BL2:	NOEPL←(NOEPA MAX EDGMIN)+NOEPM;

	BEGIN "BLOCK2"
	LABEL BL3;
	SAFEX INTERNAL REAL ARRAY EAX,EAY,EBX,EBY[1:NOEPL];
	SAFEX INTERNAL INTEGER ARRAY LE[1:NOEPL];
	SUMINT(EAX[1],EAY[1],EBX[1],EBY[1],LE[1]);
	IF WHERE≠1∧WHERE≠10 THEN EDREST;

_ * * *          Line data-structure. Display-buffer.		* * * * *;


BL3:	NOBAL ← NOBAL MAX LINMIN;
	MAXSCF ← 2*(MAXNOV ← 2*(MAXNOL ← NOBAL+NOBAL*RMSAF+MSAFA));
	DISLAS ← NOEPL+NOEPL%10+4*MAXNOV+280;

	BEGIN "BLOCK3"
	SAFEX INTERNAL INTEGER ARRAY DISBUF[1:DISLAS+2],LEDG1,LEDG2,LCREDE,
		LFEAT[1:MAXNOL],LVERSI,LVERCO,LVER,LINK[1:MAXNOV],
		CFEAT[1:MAXSCF];
	SAFEX INTERNAL REAL ARRAY XVCOR,YVCOR,SVANG,XLCOR,YLCOR[1:MAXNOV],

		CXL,CYL,CCL,RLEN,ANGARG[1:MAXNOL];
	LABEL COMND,COM1,COM2,MARK,UNMARK,CALL1,SHOW,KILL,SETT,PRINT,CALL,
		CPA,SAV,INP,INP1,PLOT,DOIT,EDIT,DD,NO,NO1,UPLIN,COM3,
		RECEV,REC1;

	LININT(CXL[1],CYL[1],CCL[1],ANGARG[1],RLEN[1],XLCOR[1],YLCOR[1]);
	LNINTA(LVERCO[1],LVERSI[1],XVCOR[1],YVCOR[1],LCREDE[1],LVER[1],
		LINK[1]);
	III←-1;
	START_CODE DEFINE TTY="'51000000000"; TTY 6,III; END;
	III ← IF III<0 THEN LOCATION(DISBUF[1])-1 ELSE 0;
_ initialization and program (command) loop of BLOCK3.;

	IF WHERE≠1 THEN BEGIN UNTELL; LIREST END;

	_	initialize display routines;

	DPYSET(DISBUF);
	DISFUS←DPYPARS-1;
	RELOPT;
	OVERLAY←TRUE;
	DADR[1]←4;
	DBRSI[1]←'4046;
	DADR[2]←14;
	DBRSI[2]←'4046;
	DADR[3]←IA←55+NOEPL+NOEPL%10;
	DBRSI[3]←'1046;
	DADR[4]←IA←IA+210;
	DBRSI[4]←'4046;
	DADR[5]←IA←IA+MAXNOV+5;
	DBRSI[5]←'1046;
	DADR[6]←IA←IA+MAXNOV+5;
	DBRSI[6]←'1046;
	DADR[7]←IA+2*MAXNOV+5;	_ Last pog. is a dummy (for jump address);
	INITIA;
	TRANSUP;
	NODIS←0;

	_ 	dispatch when returning from array expansion-contraction;

	CASE WHERE OF BEGIN
		;
		"1-normal value"	;
		"2-LINEFIT"	GO CALL1;
		"3-NOEDGES"	GO NO1;
		"4-CONTRACT"	GO COM3;
		"5-INSERT"	BEGIN LINED; GO COM2 END;
		"6-SPLITL"	BEGIN LINED; GO COM2 END;
		"7-NOLINES"	GO NO1;
		"8-LIREST"	GO INP1;
		;
		"10-EDREC"	GO REC1;
		"11-EDREST"	GO INP1;
		;;;;
		"16-PRO-LNSRT"	BEGIN CREPRO; GO COM2 END;
		"17-PRREST"	GO INP1;
		"18-PRO-NPRO"	BEGIN CREPRO; GO COM2 END;
		"19-PRO-MXPLT"  BEGIN CREPRO; GO COM2 END;
		"20-PARSE"	GO CPA;
		      END;
_ command decoding loop;

COMND:	IF ¬MODE THEN
		BEGIN
		OUTSTR(CL&"$"&CL);
		MODE ← -1;
		END;
	H←QREAD;

COM1:	IF EQU(H,"DO") THEN GO DOIT;
	IF EQU(H,"DD") THEN GO DD;
	IF EQU(H,"MARK") THEN GO MARK;
	IF EQU(H,"UNMARK") THEN GO UNMARK;
	IF EQU(H,"EDIT") THEN GO EDIT;
	IF EQU(H,"SET") THEN GO SETT;
	IF EQU(H,"CALL") THEN GO CALL;
	IF EQU(H,"SHOW") THEN GO SHOW;
	IF EQU(H,"KILL") THEN GO KILL;
	IF EQU(H,"PRINT") THEN GO PRINT;
	IF EQU(H,"PLOT") THEN GO PLOT;
	IF EQU(H,"SAVE") THEN GO SAV;
	IF EQU(H,"NO") THEN GO NO;
	IF EQU(H,"INPUT") THEN GO INP;
	IF EQU(H,"RECEIVE") THEN GO RECEV;
	IF EQU(H,"H") THEN DHOLD←1 ELSE
	IF EQU(H,"D") THEN BEGIN DHOLD←0; UPPDAT; END ELSE
	IF EQU(H,"MOVE") THEN
		BEGIN
		IRX←IRX-ISCX*NUMI;
		IRY←IRY-ISCY*NUMI;
		TRANSUP;
		END ELSE
	IF EQU(H,"UPDIS") THEN
		BEGIN
		DFORCE ← 1;
		DICH[0] ← NUMI;
		UPPDAT;
		DFORCE ← 0;
		END ELSE
	IF EQU(H,"BLANK") THEN LOOP(IA,1,35,1) OUTSTR(CL) ELSE
	IF EQU(H,"CLEAR") THEN K_ZERO ELSE
	IF EQU(H,"CLOSE") THEN K_OUT;

COM2:	IF BRCHAR≠'12 THEN BEGIN H←QREAD; WHERE←1; GO COM1 END;
	GO COMND;
_ sub-command decoding - DO, MARK, UNMARK, PLOT;

DOIT:	IF EQU(H←QREAD,"FILE") THEN
		BEGIN
		OPEN(MCHN[CFILES+1]←GETCHAN,"DSK",0,2,0,900,BRCHAR,MEOF);
		LOOKUP(MCHN[CFILES+1],MFILE←QREAD,IA);
		IF IA THEN BEGIN OUTSTR(" WHAT FILE?"); GO COMND END;
		CMSAV[CFILES←CFILES+1]←COMSTR;
		COMSTR←NULL;
		END ELSE IF EQU(H,"COM") THEN
			COMSTR←CMSTRS[NUMI]&COMSTR
		    ELSE BEGIN QUEST; GO COMND END;
	MODE←1;
	GO COMND;

DD:	GO COMND;   _ A breakpoint here is a convenient way to get into RAID;

MARK:	H←QREAD;
	IF EQU(H,"EDGES") THEN DISP[3]←1 ELSE
	IF EQU(H,"VERTICES") THEN DISP[6]←1 ELSE
	IF EQU(H,"LINES") THEN DISP[5]←1 ELSE GO COM1;
	UPPDAT;
	QUNFIN MARK;

UNMARK:	H←QREAD;
	IF EQU(H,"EDGES") THEN DISP[3]←0 ELSE
	IF EQU(H,"VERTICES") THEN DISP[6]←0 ELSE
	IF EQU(H,"LINES") THEN DISP[5]←0 ELSE GO COM1;
	UPPDAT;
	QUNFIN UNMARK;

PLOT:	TELL("plotting");
	LOOP(IA,1,14,1) BEGIN DISPS[IA]←DISP[IA]; DISP[IA]←0 END;
	WHILE BRCHAR≠'12 DO DISP[NUMI]←1;
	PLT←1;
	UPPDAT;
	PRECAL;
	CALC;
	LOOP(IA,1,14,1) DISP[IA]←DISPS[IA];
	UPPDAT;
	UNTELL;
	PLT←0;
	GO COMND;
_	more sub-command decoding - EDIT, KILL, PRINT;

EDIT:	H←QREAD;
	IF EQU(H,"PARAM") THEN SETPAR ELSE
	IF EQU(H,"LINES") THEN
		BEGIN
		LINED;
		IF WHERE=5∨WHERE=6 THEN
			BEGIN
			IF EQU(LIEXT,".TEM") THEN LISAVE;
			NODIS←1;
			GO BL3;
			END;
		END ELSE
	IF EQU(H,"PROT") THEN
		BEGIN
		EDLIN←NUMI;
COM3:		CREPRO;
		IF WHERE≥18 THEN
			BEGIN
			NODIS←1;
			IF EQU(LIEXT,".TEM") THEN LISAVE;
			IF EQU(EDEXT,".TEM") THEN EDSAVE;
			IF EQU(PREXT,".TEM") THEN PRSAVE;
			TELL("prot-expand");
			GO BL1;
			END;
		IF WHERE=16 THEN
			BEGIN
			NODIS←1;
			IF EQU(LIEXT,".TEM") THEN LISAVE;
			GO BL3;
			END;
		END ELSE
	IF EQU(H,"COM") THEN COMST ELSE GO COM1;
	QUNFIN EDIT;

KILL:	H←QREAD;
	IF EQU(H,"FRAME") THEN DISP[1]←0 ELSE
	IF EQU(H,"EDGES") THEN BEGIN DISP[2]←DISP[3]←0  END  ELSE
	IF EQU(H,"LINES") THEN DISP[4]←DISP[5]←DISP[6]←0 ELSE GO COM1;
	UPPDAT;
	QUNFIN KILL;

PRINT:	H←QREAD;
	IF EQU(H,"REGREF") THEN REGREF(NUMI)  ELSE
	IF EQU(H,"EDGES") THEN EDGPRT ELSE GO COM1;
	QUNFIN PRINT;
_  more sub-command decoding - SET;

SETT:	H←QREAD;
	IF EQU(H,"SCALE") THEN
		BEGIN
		ISCX←1./QRSET(DSCX);
		ISCY←1./QRSET(DSCY);
		TRANSUP;
		END ELSE
	IF EQU(H,"BRTSIZ") THEN
		BEGIN 
		DBRSI[IB←NUMI]←'46 LOR (NUMI LSH 
			(IF IB≤2∨IB=4 THEN 11 ELSE 8));
		DICH[IB]←1;
		UPPDAT
		END ELSE
	IF EQU(H,"FULREC") THEN QSET(FULREC) ELSE
	IF EQU(H,"LOC") THEN TYPLOC(QSET(LOCT),QSET(LOCB)) ELSE
	IF EQU(H,"WHAT") THEN QSET(IWHAT) ELSE
	IF EQU(H,"TRACE") THEN QSET(MTRACE) ELSE
	IF EQU(H,"CVLIN") THEN BEGIN QSET(CVLIN);DICH[4]←1;UPPDAT END ELSE
	IF EQU(H,"WIND") THEN QSET(WIND) ELSE
	IF EQU(H,"LDATE") THEN QSET(LDATE) ELSE
	IF EQU(H,"NAME") THEN
		BEGIN
		OUTSTR(" NAME = "&NAME&" ← ");
		NAME←QREAD;
		NOUT←NGRF←NLPT←"A"
		END  ELSE
	IF EQU(H,"LNCRE") THEN
		BEGIN
		QSET(LNCRE1);
		QSET(LNCRE2);
		DICH[4]←DICH[5]←DICH[6]←1;
		UPPDAT
		END  ELSE
	IF EQU(H,"DISRPT") THEN BEGIN QSET(DRX);QSET(DRY);TRANSUP END ELSE
	IF EQU(H,"INTRPT") THEN BEGIN QRSET(IRX); QRSET(IRY); TRANSUP END
	   ELSE GO COM1;
	QUNFIN SETT;
_ more sub-command decoding - CALL;

CALL:	H←QREAD;

CALL1:	IF EQU(H,"LINFIT") THEN
		BEGIN
		INITIA;
		IF WHERE=1 THEN TELL("line-fit");
		WHERE←1;
		IDUM←LINFIT;
		IF IDUM THEN
			BEGIN
			WHERE←2;
			TELL("expanding");
			NOL ← NOV ← 0;
			GO BL3
			END ELSE BEGIN
			DICH[4]←DICH[5]←DICH[6]←1;
			UPPDAT;
			UNTELL
			END
		END ELSE 
	IF EQU(H,"SORTED") THEN BEGIN SORTED; DICH[3]←1; UPPDAT END  ELSE
	IF EQU(H,"UNXREF") THEN BEGIN UNXREF;GO TO UPLIN; END ELSE
	IF EQU(H,"FTEX") THEN FTEX ELSE
	IF EQU(H,"PARSE") THEN
		BEGIN
		MAPTRC←MAPCONV(QREAD);
		IF NOL>0.65*MAXNOL THEN
			BEGIN
			NOBAL←(1.6*NOL-MSAFA)/RMSAF+1;
			TELL("expanding");
			IF EQU(LIEXT,".TEM") THEN LISAVE;
			NODIS←1;
			WHERE←20;
			GO BL3
			END;
CPA:		LIEXT←".TEM";
		WHERE←1;
		PARSE
		END ELSE
	IF EQU(H,"XREF") THEN
		BEGIN XREFC(NUMI);
UPLIN:		DICH[6]←1;
		IF CVLIN THEN DICH[4]←1;
		UPPDAT
		END  ELSE GO COM1;
	QUNFIN CALL;
_ more sub-command decoding - SHOW;

SHOW:	H←QREAD;
	IF EQU(H,"INTRPT") THEN
		OUTSTR(" ("&CVS(DISX(IRX))&","&CVS(DISY(IRY))&")"&CL) ELSE
	IF EQU(H,"LNFEAT") THEN
		BEGIN
		IDUM←LNFEAT(NUMI);
		OUTSTR(EXPL(IDUM,'430771430771,"{#≥#≤∧-∀-.≡#≥#≤∧-∀-.}")&
			(QFTREV)&"  ENTRY: "&CVS(FINDFT(IDUM))&CL)
	        END ELSE
	IF EQU(H,"COFEAT") THEN
		BEGIN
		LOOP(IA,1,2,1) BEGIN IB←IDUM; IDUM←NUMI; IC←ID;
		    ID←FINDFT(LNFEAT(IDUM))*(FTREV=1) END;
		IDUM←COFEAT(IB,IDUM,IC,ID);
		OUTSTR(EXPL(IDUM,'401437401437,"{*→@∀---≡*→@∀---}")&(QFTREV)&
		  "  ENTRY: "&CVS(FINDFT(IDUM))&CL)
		END ELSE
	IF EQU(H,"CFEAT")∧(IDUM←NUMI+PLFTOT)≤PFTOT THEN
		BEGIN
		IDUM←BITS(PFPTR[IDUM],12,23);
		WHILE IDUM DO
		    OUTSTR(CVS(IDUM)&" →  L1: "&CVS((IA←BITS(IDUM←
			CFEAT[IDUM],24,35)) LAND '3777)&" "&
			CVS(IA LSH -11)&"  L2: "&CVS((IA←BITS(IDUM,12,23))
			 LAND '3777)&" "&CVS(IA LSH -11)&"  → "&
			CVS(IDUM←IDUM LAND '7777)&CL)
		END ELSE
	IF EQU(H,"LFDIF") THEN
		BEGIN
		IA←LNFEAT(NUMI);
		IB←-(FTREV=1);
		IC←LNFEAT(NUMI);
		ID←-(FTREV=1);
		OUTSTR(EXPL(LFDIF(IA,IC,NUMI XOR IB,NUMI XOR ID,FALSE),
			    '742105742105,"{-≥-#SEC≡-≥-#SEC}")&
		 " + "&EXPL(MODIF,'252525252525,"{-----------------}")&CL)
	 	END  ELSE
	IF EQU(H,"FRAME") THEN DISP[1]←1 ELSE
	IF EQU(H,"EDGES") THEN
		BEGIN
		IA←IAEDG;
		IAEDG←NUMI;
		DISP[2]←1;
		IF IA≠IAEDG THEN DICH[2]←1
		END ELSE
	IF EQU(H,"LINES") THEN DISP[4]←1 ELSE GO COM1;
	UPPDAT;
	QUNFIN SHOW;
_ more sub-command decoding - NO, SAV;

NO:	H←QREAD;
	IF EQU(H,"EDGES") THEN
		BEGIN
		EDEXT←".TEM";
		IF EQU(LIEXT,".TEM") THEN LISAVE;
		NOEPA←0;
		DICH[2]←DICH[3]←1;
		UPPDAT;
		NODIS←1;
		WHERE←3;
		GO BL2
		END ELSE
	IF EQU(H,"LINES") THEN
		BEGIN
		LIEXT←".TEM";
		NOBAL←NOL←0;
		DICH[4]←DICH[5]←DICH[6]←1;
		UPPDAT;
		WHERE←7;
		GO BL3
	        END ELSE GO COM1;
NO1:	WHERE←1;
	QUNFIN NO;

SAV:	H←QREAD;
	IF EQU(H,"EDGES") THEN BEGIN FILESP(2); EDSAVE END ELSE
	IF EQU(H,"LINES") THEN BEGIN SHUFFL; FILESP(1); LISAVE END ELSE
	IF EQU(H,"PROT")  THEN BEGIN FILESP(3); PRSAVE END ELSE
	IF EQU(H,"STRUCT") THEN OUTLINES ELSE GO COM1;
	QUNFIN SAV;
_ more sub-command decoding - RECEIVE;

RECEV:	IF MODE≥0 THEN
		BEGIN "ERR2"
		OUTSTR("RECEIVE COMMAND ONLY LEGAL AS M.P. !!"&CL);
		GO COM2;
		END "ERR2";
	H ← QREAD;
	IF EQU(H,"EDGES") THEN
		BEGIN "MEDGE"
		INTEGER MESS;
		MESS ← GET_ENTRY('70,"EDGE","GUNLO","G_EDGES");
		IF ¬MESS THEN
			BEGIN "ERR1"
			OUTSTR("NO EDGE DATA AVAILABLE"&CL);
			GO COM2;
			END "ERR1";
		QUEUE('600,MESS);
		NOL ← NOV ← 0;
		IF NOEPL<NOEPA THEN
			BEGIN "EXP"
			WHERE ← 10;
			NOBAL ← NOEPA*RDEP/8.;
			TELL("EDGE-EXPAND");
			GO BL2;
			END "EXP";

REC1:		WHERE ← 1;
		EDREC;
		END "MEDGE" ELSE GO COM1;
	UPPDAT;
	QUNFIN RECEV;
_ end of sub-command decoding - INPUT;

INP:	H←QREAD;
	IF EQU(H,"EDGES") THEN
		BEGIN
		FILESP(2);
		EDREST;
		QERR;
		IF WHERE=11 THEN
			BEGIN
			NOBAL←NOEPA*RDEP/8.;
			TELL("edge-expand");
			GO BL2
			END;
		END ELSE
	IF EQU(H,"LINES") THEN
		BEGIN
		FILESP(1);
		LIREST;
		QERR;
		DICH[4]←DICH[5]←DICH[6];
		IF WHERE=8 THEN
			BEGIN
			TELL("line-expand");
			GO BL3
			END;
		END ELSE
	IF EQU(H,"PROT")  THEN
		BEGIN
		FILESP(3);
		PRREST;
		QERR;
		IF WHERE=17 THEN
			BEGIN
			TELL("prot-expand");
			GO BL1
		        END
 	        END ELSE GO COM1;
INP1:	WHERE←1;
	UPPDAT;
	QUNFIN INP;

_ * * * * *      THAT WAS THE END OF THE COMMAND-LOOP      * * * * *;

	END "BLOCK3";

	END "BLOCK2";

	END "BLOCK1";

END "GUNLO";_	 END OF GUNLOK	;